package com.zhugang.week13.program;

/**
 * @program algorithms
 * @description: checkIp
 * @author: chanzhugang
 * @create: 2022/09/11 11:16
 */
public class CheckIp {

    /**
     * IP地址解析
     * 拼多多
     *
     * @param ip
     * @return
     */
    public boolean checkIp(String ip) {
        /**
         * ip合法规则如下：
         * 1、除了空格、数字和.之外，不包含其他字符
         * 2、ip地址有四位数字构成，由.分隔，每个数字大小在0-255之间
         * 3、数字前后可以有空格、但中间不能有空格 "123. 92.2.34 "合法， "12 3.9 2.2.34" 不合法
         */

        // 分割ip成4个部分，判断每部分是否合法，提取公共方法
        if (ip == null) {
            return false;
        }
        // 注意必须使用转义符
        String[] split = ip.split("\\.");
        if (split.length != 4) {
            return false;
        }
        for (String segment : split) {
            boolean valid = checkSegment(segment);
            if (!valid) {
                return false;
            }
        }
        return true;
    }


    private boolean checkSegment(String s) {
        // 可以有前导空格
        int n = s.length();
        int i = 0;
        while (i < n && s.charAt(i) == ' ') {
            i++;
        }
        if (i == n) {
            // 全部都是空格
            return false;
        }

        // 字符是否是数字，字符转成数字，判断是否在0-255之间
        int digit = 0;
        while (i < n && s.charAt(i) != ' ') {
            char c = s.charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }

            digit = digit * 10 + (c - '0');
            if (digit > 255) {
                return false;
            }
            i++;
        }
        // 不能有后导空格
        while (i < n) {
            if (s.charAt(i) != ' ') {
                // 如 "123 " or "12 3"，空格后还有数字
                return false;
            }
            i++;
        }
        return true;
    }

    public static void main(String[] args) {
        CheckIp checkIp = new CheckIp();
        String ip = "123.9.2.3 4";
        boolean flag = checkIp.checkIp(ip);
        System.out.println(flag);
    }
}